/**
 * 文件名：@DefaultExceptionModelResolver.java <br/>
 * 包名：cn.efunbox.afw.web.mvc.exception <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.mvc.exception;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.LocaleResolver;

import cn.efunbox.afw.core.exception.TraceableException;
import cn.efunbox.afw.core.util.MessageUtil;
import cn.efunbox.afw.web.entity.HttpResult;

/**
 * 类名：DefaultExceptionModelResolver  <br />
 *
 * 功能：默认异常模型数据解析器
 *
 * @author xtwin <br />
 * 创建时间：2016年8月5日 上午3:17:50  <br />
 * @version 2016年8月5日
 */
public class DefaultExceptionModelResolver implements ExceptionModelResolver {
	
	// locate解析器
	protected LocaleResolver localeResolver;
	
	// 默认locale
	protected Locale defaultLocale = Locale.SIMPLIFIED_CHINESE;
	
	// 默认错误码
	protected Integer defaultHttpStatus = 502;
	
	// 数字
	protected Pattern numberPattern = Pattern.compile("\\d+");
	
	/**
	 * 功能: 异常模型解析 <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年8月23日 下午12:27:42<br/>
	 * 
	 * @param request
	 * @param response
	 * @param e
	 * @return <br/>
	 * @see cn.efunbox.afw.web.mvc.exception.ExceptionModelResolver#resolve(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.Exception)
	 */
	@Override
	public HttpResult<?> resolve(HttpServletRequest request, HttpServletResponse response, Exception e) {
		// 组装数据
		Map<String, Object> datas = new HashMap<>();
		
		// http状态码
		int status = defaultHttpStatus;
		
		if (e instanceof TraceableException) {
			TraceableException tex = (TraceableException) e;
			
			String code = tex.getCode();
			
			if (null == code) {
				code = "system.error";
			} else if (numberPattern.matcher(code).matches()) {
				// 数字
				status = Integer.parseInt(code);
			}
			
			datas.put("code", null == tex.getCode() ? "system.error" : tex.getCode());
			datas.put("message", getMessage(request, tex.getLocalMessage(), tex.getParameters(), tex.getLocalMessage()));
		} else {
			datas.put("code", "system.error");
			datas.put("message", getMessage(request, "system.error", null, "系统异常"));
		}
		
		// 结果对象
		return HttpResult.of(datas, status, null, e);
	}
	
	/**
	 * 功能：国际化 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月19日 下午12:15:58 <br/>
	 */
	protected String getMessage(HttpServletRequest request, String code, Object[] args, String _default) {
		Locale locale = null;
		if (null != localeResolver) {
			localeResolver.resolveLocale(request);
		}
		
		if (null == locale) {
			locale = defaultLocale;
		}
		
		return MessageUtil.getMessage(code, args, locale, _default, false);
	}

	/**
	 * @version 2016年8月19日-下午12:25:17
	 */
	public void setLocaleResolver(LocaleResolver localeResolver) {
		this.localeResolver = localeResolver;
	}

	/**
	 * @version 2016年8月19日-下午12:25:17
	 */
	public void setDefaultLocale(Locale defaultLocale) {
		this.defaultLocale = defaultLocale;
	}

	/**
	 * @version 2016年8月23日-下午1:45:04
	 */
	public void setDefaultHttpStatus(Integer defaultHttpStatus) {
		this.defaultHttpStatus = defaultHttpStatus;
	}

	/**
	 * @version 2016年8月23日-下午1:45:31
	 */
	public void setNumberPattern(Pattern numberPattern) {
		this.numberPattern = numberPattern;
	}
}
